Руководство для начинающих¶
В этом руководстве вы познакомитесь с основными возможностями Tarantool DB. В примере вы создаете шардированный спейс через веб-интерфейс, выполняете запросы к нему с помощью модуля CRUD, а затем проверяете работу кластера при остановке узла.
Запустить кластер для выполнения примера можно, используя любой способ развертывания:
инсталлятор Ansible Tarantool Enterprise;
В руководстве для развертывания используется Docker compose.
Важно
Запуск в Docker compose является вспомогательным способом и используется для тестирования и демонстрации в примерах документации. Для целевого развертывания используйте Ansible Tarantool Enterprise.
Руководство включает следующие шаги:
Пререквизиты¶
Для выполнения примера требуются:
установленный Docker-образ Tarantool DB;
приложение Docker compose;
утилита TT CLI;
исходные файлы примера
up_with_docker_compose
.Примечание
Есть два способа получить исходные файлы примера:
Архив с полной документацией Tarantool DB, полученный по почте или скачанный в личном кабинете tarantool.io. Пример архива:
tarantooldb-documentation-1.0.0.tar.gz
. Примерup_with_docker_compose
расположен в таком архиве в директории./doc/examples/up_with_docker_compose/
.Отдельный архив up_with_docker_compose.tar.gz, скачанный c сайта Tarantool.
Запуск стенда¶
Запустить кластер Tarantool DB можно с помощью следующей команды:
docker compose up -d --build
Ответ выглядит так:
[+] Running 11/11
⠿ Network up_with_docker_compose_tarantooldb_network Created 0.1s
⠿ Container up_with_docker_compose-tarantool-storage-1-msk-1 Started 5.0s
⠿ Container up_with_docker_compose-tarantool-router-spb-1 Started 3.8s
⠿ Container up_with_docker_compose-tarantool-router-msk-1 Started 5.2s
⠿ Container up_with_docker_compose-etcd3-1 Started 3.7s
⠿ Container up_with_docker_compose-tarantool-storage-1-spb-1 Started 4.9s
⠿ Container up_with_docker_compose-etcd1-1 Started 4.4s
⠿ Container up_with_docker_compose-etcd2-1 Started 5.3s
⠿ Container up_with_docker_compose-tarantool-storage-2-spb-1 Started 5.1s
⠿ Container up_with_docker_compose-tarantool-storage-2-msk-1 Started 5.1s
⠿ Container up_with_docker_compose-user-host-1 Started 6.4s
Создание спейса через веб-интерфейс¶
После запуска с кластером Tarantool DB можно работать через веб-интерфейс, коннекторы или консоль.
Создайте спейс, с которым вы будете работать в дальнейшем. Для этого:
Откройте в браузере веб-интерфейс любого из узлов Tarantool DB (http://localhost:8081).
Перейдите на вкладку Code.
На вкладке Code создайте папку
migrations
. Внутри папкиmigrations
создайте папкуsource
. Названия этих папок менять нельзя.В папке
source
создайте файл с любым названием, напримерcreate_space_bands.lua
. Добавьте в файл следующий код:local function up() local utils = require('migrator.utils') box.schema.space.create('bands', {if_not_exists = true}) box.space.bands:format({ { name = 'id', type = 'integer' }, { name = 'bucket_id', type = 'unsigned' }, { name = 'band_name', type = 'string' }, { name = 'year', type = 'integer' }, }) box.space.bands:create_index('primary_key', { parts = {'id'}, if_not_exists = true}) box.space.bands:create_index('bucket_id', { parts = {'bucket_id'}, unique = false, if_not_exists = true}) utils.register_sharding_key('bands', {'id'}) return true end return { up = up, }
Нажмите кнопку Apply.
Запустите миграции с помощью следующей команды:
curl -X POST http://localhost:8081/migrations/up
Здесь:
localhost:8081
– адрес экземпляра.
Ответ выглядит так:
{"applied":["create_space_bands.lua"]}
В результате на всех узлах кластера создан шардированный спейс bands
.
Содержимое спейса на каждом узле кластера можно просмотреть в веб-интерфейсе во вкладке Space Explorer.
Пример загрузки конфигурации и клиентского кода через API можно найти в разделе Запуск кластера через Docker compose.
Запросы к данным c помощью модуля CRUD¶
Подключитесь к узлу кластера с помощью утилиты tt
.
Команда tt connect
открывает интерактивную консоль Tarantool, позволяющую работать с базой данных:
tt connect admin:secret-cluster-cookie@localhost:3301
Теперь добавьте в спейс bands
несколько кортежей:
crud.insert_object('bands', {id = 1, band_name = 'Roxette', year = 1986})
crud.insert_object('bands', {id = 2, band_name = 'Scorpions', year = 1965})
crud.insert_object('bands', {id = 3, band_name = 'Ace of Base', year = 1987})
crud.insert_object('bands', {id = 4, band_name = 'The Beatles', year = 1960})
После этого просмотрите содержимое спейса с помощью операции crud.select()
:
crud.select('bands')
Вывод выглядит так:
---
- metadata: [{'name': 'id', 'type': 'integer'}, {'name': 'bucket_id', 'type': 'unsigned'},
{'name': 'band_name', 'type': 'string'}, {'name': 'year', 'type': 'integer'}]
rows:
- [1, 12477, 'Roxette', 1986]
- [2, 21401, 'Scorpions', 1965]
- [3, 11804, 'Ace of Base', 1987]
- [4, 28161, 'The Beatles', 1960]
- null
...
Теперь прочитайте запись, у которой id = 1
:
crud.get('bands', 1)
---
- rows:
- [1, 12477, 'Roxette', 1986]
metadata: [{'name': 'id', 'type': 'integer'}, {'name': 'bucket_id', 'type': 'unsigned'},
{'name': 'band_name', 'type': 'string'}, {'name': 'year', 'type': 'integer'}]
- null
...
Теперь обновите запись с id = 3
, увеличив значение на единицу:
crud.update('bands', 3, {{'+', 'year', 1}})
---
- rows:
- [3, 11804, 'Ace of Base', 1988]
metadata: [{'name': 'id', 'type': 'integer'}, {'name': 'bucket_id', 'type': 'unsigned'},
{'name': 'band_name', 'type': 'string'}, {'name': 'year', 'type': 'integer'}]
- null
...
Удалите запись с id = 4
:
crud.delete('bands', 4)
---
- rows:
- [4, 28161, 'The Beatles', 1960]
metadata: [{'name': 'id', 'type': 'integer'}, {'name': 'bucket_id', 'type': 'unsigned'},
{'name': 'band_name', 'type': 'string'}, {'name': 'year', 'type': 'integer'}]
- null
...
Просмотрите еще раз содержимое спейса bands
:
crud.select('bands')
---
- metadata: [{'name': 'id', 'type': 'integer'}, {'name': 'bucket_id', 'type': 'unsigned'},
{'name': 'band_name', 'type': 'string'}, {'name': 'year', 'type': 'integer'}]
rows:
- [1, 12477, 'Roxette', 1986]
- [2, 21401, 'Scorpions', 1965]
- [3, 11804, 'Ace of Base', 1988]
- null
...
Здесь:
значение
year
в кортеже сid = 3
увеличилось на 1;запись с
id = 4
успешно удалена.
Проверка работы кластера при отказах¶
Отказ – это любое событие, которое приводит к недоступности узла кластера. Примеры отказов: потеря связи с узлом, выход из строя оборудования с расположенным на нем узлом.
Этот пример можно выполнить на локально развёрнутом кластере двумя способами:
через Docker compose;
через утилиту tt.
Имитация отказа в Docker compose¶
Для имитации отказа остановите узлы кластера с помощью команды docker compose stop
:
docker compose stop tarantool-storage-1-msk
docker compose stop tarantool-storage-2-spb
Имитация отказа в TT CLI¶
Чтобы имитировать отказ с помощью утилиты tt
, нужно дополнительно настроить кластер.
Для этого:
Откройте в браузере веб-интерфейс Tarantool DB по адресу http://localhost:8081.
Перейдите на вкладку Cluster и нажмите кнопку Failover: disabled в правом верхнем углу. Установите для параметров следующие значения:
Failover mode
:Stateful
;Failover timeout
: 5. Время ожидания failover (восстановления после сбоев) в 5 секунд позволит узлу master быстрее переключаться при отказе;State provider
:Tarantool (stateboard)
;Password
:passwd
.
Нажмите кнопку Apply. Если параметры применены успешно, появится зеленое всплывающее уведомление. Кнопка Issues: 0 при этом должна стать неактивной. Если это не так, проверьте введенный пароль или попробуйте ввести пароль ещё раз.
Для имитации отказа остановите несколько узлов кластера с помощью команды tt stop
, например хранилища storage-1-msk
и storage-2-spb
:
tt stop tarantooldb:storage-1-msk
tt stop tarantooldb:storage-2-spb
Теперь оба узла отмечены в веб-интерфейсе как UNREACHABLE
(недоступен).
Для имитации отказа можно использовать и другой способ: найти PID этих процессов и выполнить команду kill
.
Проверка работы кластера¶
Чтобы проверить, что остановленные узлы не мешают работе кластера, просмотрите ещё раз всё содержимое таблицы:
crud.select('bands')
Ответ выглядит так:
---
- metadata: [{'name': 'id', 'type': 'integer'}, {'name': 'bucket_id', 'type': 'unsigned'},
{'name': 'band_name', 'type': 'string'}, {'name': 'year', 'type': 'integer'}]
rows:
- [1, 12477, 'Roxette', 1986]
- [2, 21401, 'Scorpions', 1965]
- [3, 11804, 'Ace of Base', 1988]
- null
...
Изменение конфигурации кластера¶
Перед изменением конфигурации кластера, например, при добавлении новых наборов реплик или перераспределении данных между узлами, требуется выполнить несколько предварительных шагов. Эти шаги необходимы для обеспечения стабильной работы запросов к данным.
Перед изменением конфигурации кластера:
Приостановите любые DML-операции (insert, update, delete) во всех компонентах системы.
Выполните масштабирование или инициируйте ребалансировку.
Дождитесь полного завершения процесса миграции бакетов.
На всех роутерах выполните сброс маршрутов:
vshard.router._route_map_clear()
Возобновите выполнение DML-операций.
После этого вы можете выполнить изменение конфигурации кластера.
Важно
Несоблюдение этой последовательности шагов перед изменением конфигурации может привести к некорректной маршрутизации запросов, в том числе к дублированию записей, потерянным обновлениям или несогласованными данными между наборами реплик в процессе миграции бакетов.